package com.powergame.model;

import com.powergame.exceptions.PowerGameException;
import com.powergame.main.PowerGame2DMain;

/**
 * OrdreDeplacement.java
 *
 * Ordre de déplacement d'une pièce dans un autre secteur
 *
 * @author ToF
 */
public class OrdreDeplacement extends Ordre {

    /** La pièce à deplacer */
    private TypePiece piece = null;
    
    /** La position de départ de la pièce */
    private Secteur depart = null;
    
    /** Secteur de destination */
    private Secteur destination = null;
    
    public OrdreDeplacement(FeuilleOrdres feuille, TypePiece aDeplacer, Secteur depart, Secteur destination){
        super(feuille);
        this.piece = aDeplacer;
        this.depart = depart;
        this.destination = destination;
    }

    public Secteur getDestination() {
        return destination;
    }

    public void setDestination(Secteur destination) {
        this.destination = destination;
    }

    public Secteur getDepart() {
        return depart;
    }

    public void setDepart(Secteur depart) {
        this.depart = depart;
    }

    public TypePiece getPiece() {
        return piece;
    }

    public void setPiece(TypePiece piece) {
        this.piece = piece;
    }

    @Override
    public void execute() throws PowerGameException {
        
        Joueur joueur = getJoueur();
        
        if(getDepart().getType().equals(TypeSecteur.SECTEUR_RESERVE)){
            // La pièce n'est pas sur le plateau
            // déplacement autorisé seulement vers le qg
            Piece p = getDepart().getPieceParType(joueur.getEquipe(), getPiece());
            if(p == null){
                throw new PowerGameException("Pas de pièce '" + getPiece() + "' en réserve !");
                
            }else{
                Secteur HQ = getPlateau().findSecteur(joueur.getEquipe(), TypeSecteur.SECTEUR_QG);
                if(HQ == null){
                    throw new PowerGameException("Le joueur n'a pas de QG !");
                    
                }else{
                    p.setPosition(HQ);
                    PowerGame2DMain.getInstance().ajoutePiece(p);
                }
            }
            
        }else{
            // Déplacement d'une pièce déjà sur le plateau
            Piece p = getDepart().getPieceParType(joueur.getEquipe(), getPiece());
            if(p == null){
                throw new PowerGameException("Pas de pièce '" + getPiece() + "' en réserve !");
                
            }else{
                p.moveTo(getPlateau(), getDestination());
            }
        }
    }

    @Override
    public String toString() {
        String etat = "";
        if(getEtat() == EXECUTION_EN_COURS){
            etat = "-";
        }else if(getEtat() == TERMINE_ERREUR){
            etat = "Echec";
        }else if(getEtat() == TERMINE_OK){
            etat = "OK";
        }else if(getEtat() == EN_ATTENTE){
            etat = "?";
        }
        
        return getDepart().getId() + "=(" + getPiece().getLibelle() + ")=>" + getDestination().getId() + " : " + etat;
    }
}
